package com.hlkj.baojin.utils.hik;

import java.util.regex.Matcher;
import java.util.regex.Pattern;

/**
 * <p>
 * 字段有效性验证器
 * </p>
 * @author chixueshun Jan 11, 2011 9:52:12 AM
 * @version V1.0
 */
public class FieldValidator {
	
	/**
	 * 判断是否为有效IP地址
	 * 
	 * @param s
	 * @return
	 */
	public static boolean isIPAddress(String s) {
		if (isEmpty(s)) {
			return false;
		}
		if (s.trim().equals("localhost")) {
			return true;
		}
		if ((" " + s + " ").split("[.]").length != 4) {
			return false;
		}
		s = s.trim();
		if (s.split("[.]").length != 4) {
			return false;
		}
		if (s.trim().contains(" ")) {
			return false;
		}
		String[] v = s.split("[.]");
		for (int i = 0; i < v.length; i++) {
			try {
				int n = Integer.parseInt(v[i]);
				if (n < 0 || n > 255) {
					return false;
				}
			} catch (Exception e) {
				return false;
			}
		}
		return true;
	}
	
	public static boolean isSubNetMask(String subNetMask) {
		if (isIPAddress(subNetMask)) {
			String[] s = subNetMask.split("[.]");
			boolean b = false;
			for (int i = 0; i < 4; ++i) {
				int n = Integer.parseInt(s[i]);
				String binaryString = Integer.toBinaryString(n);
				for (int j = 0; j < binaryString.length(); j++) {
					String bit = binaryString.substring(j, j + 1);
					if (bit.equals("0")) {
						b = true;
					}
					if (b && bit.equals("1")) {
						return false;
					}
				}
			}
		}
		return true;
	}
	
	/**
	 * 判断是否为有效端口
	 * 
	 * @param s
	 * @return
	 */
	public static boolean isPort(String s) {
		if (isEmpty(s)) {
			return false;
		}
		try {
			int n = Integer.parseInt(s);
			if (n < 0) {
				return false;
			}
		} catch (Exception e) {
			return false;
		}
		return true;
	}
	
	/**
	 * 判断是否为空
	 * 
	 * @param s
	 * @return
	 */
	public static boolean isEmpty(String s) {
		if (s == null || s.equals("")) {
			return true;
		}
		return false;
	}
	
	/**
	 * 判断是否为数值
	 * 
	 * @param s
	 * @return
	 */
	public static boolean isNumber(String s) {
		if (isEmpty(s)) {
			return false;
		}
		try {
			Double.parseDouble(s);
		} catch (Exception e) {
			return false;
		}
		return true;
	}
	
	public static void main(String args[]) {
		System.out.println(isSubNetMask(("255.255.5.0")));
	}
	
	/**
	 * 验证是否是Email地址
	 * @author majianbo Apr 25, 2011 4:23:54 PM
	 * @param value
	 * @return
	 */
	public static boolean isEmail(String value) {
		String emailPattern = "^([a-zA-Z0-9]*[-_]?[a-zA-Z0-9]+)*@([a-zA-Z0-9]*[-_]?[a-zA-Z0-9]+)+[\\.][A-Za-z]{2,3}([\\.][A-Za-z]{2})?$";
		return validatePattern(value, emailPattern);
	}
	
	/**
	 * 验证是否是手机号码
	 * 
	 * <pre>
	 * 中国电信发布中国3G号码段:中国联通185,186;中国移动188,187;中国电信189,180共6个号段。
	 *  3G业务专属的180-189号段已基本分配给各运营商使用, 其中180、189分配给中国电信,187、188归中国移动使用,185、186属于新联通。
	 *  中国移动拥有号码段：139、138、137、136、135、134、159、158、157（3G）、152、151、150、188（3G）、187（3G）;14个号段
	 *  中国联通拥有号码段：130、131、132、155、156（3G）、186（3G）、185（3G）;6个号段
	 *  中国电信拥有号码段：133、153、189（3G）、180（3G）;4个号码段
	 *  移动:
	 *      2G号段(GSM网络)有139,138,137,136,135,134(0-8),159,158,152,151,150
	 *      3G号段(TD-SCDMA网络)有157,188,187
	 *      147是移动TD上网卡专用号段.
	 *  联通:
	 *      2G号段(GSM网络)有130,131,132,155,156
	 *      3G号段(WCDMA网络)有186,185
	 *  电信:
	 *      2G号段(CDMA网络)有133,153
	 * 	 	3G号段(CDMA网络)有189,18
	 * </pre>
	 * 
	 * @author majianbo Apr 25, 2011 4:24:08 PM
	 * @param value
	 * @return
	 */
	public static boolean isMobilePhone(String value) {
		String mobilePhonePattern = "^((13[0-9])|(15[^4,\\D])|(18[0,5-9]))\\d{8}$";
		return validatePattern(value, mobilePhonePattern);
	}
	
	/**
	 * 验证正则表达式
	 * @author majianbo Apr 25, 2011 4:39:10 PM
	 * @param value 验证的值
	 * @param patternStr 验证的正则表达式
	 * @return
	 */
	private static boolean validatePattern(String value, String patternStr) {
		Pattern p = Pattern.compile(patternStr);
		Matcher m = p.matcher(value);
		return m.matches();
	}
}
